﻿
#ifndef PLC_STANDARD_CLASS_H
#define PLC_STANDARD_CLASS_H
#pragma once
#include <time.h>
#include <stdint.h>

namespace plc
{
#define R_TRIG CR_Trig
#define F_TRIG CF_Trig
#define TON    CTon
#define TOF    CTof
#define TONR   CTonr

//上升沿
class CR_Trig
{
public:
    CR_Trig();
    ~CR_Trig();
    void execute(bool _IN = false);
    bool getQValue();

private:
    bool Q;
    bool M;
};

//下降沿实现
class CF_Trig
{
public:
    CF_Trig();
    ~CF_Trig();
    void execute(bool _IN = false);
    bool getQValue();

private:
    bool Q;
    bool M;
};

//延时接通定时器，PT时间给定的单位（ms）
class CTon
{
public:
    CTon();
    ~CTon();
    void execute(bool _IN = false, int32_t PT = 0);
    bool getQValue();
    int32_t getETValue();   //过去的时间
private:
    bool Q;
    int32_t ET;          //过去的时间
    bool M;              //中间过程变量
    int32_t startTime;   //开始时间
};

//保持型延时接通定时器，PT时间给定的单位（ms）
class CTonr
{
public:
    CTonr();
    ~CTonr();
    void execute(bool _IN = false, int32_t PT = 0);
    void reset();
    bool getQValue();
    int32_t getETValue();   //获取持续的时间
private:
    bool Q;
    int32_t ET;          //持续的时间
    bool M;              //中间过程变量
    int32_t startTime;   //开始时间
};

//延时断开定时器，PT时间给定的单位（ms）
class CTof
{
public:
    CTof();
    ~CTof();
    void execute(bool _IN = false, int32_t PT = 0);
    bool getQValue();
    int32_t getETValue();   //过去的时间
private:
    bool Q;
    int32_t ET;          //过去的时间
    bool M;              //中间过程变量
    int32_t startTime;   //开始时间
};

}   // namespace plc

#endif
